﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Platform.ObjectModel;

namespace Platform.Storage.Entity
{
	/// <summary>
	/// Representa o par campo e valor
	/// </summary>
	public class FieldValue
	{
		protected FieldValue() // Utilizado pelo EF
		{ }

		/// <summary>
		/// 
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="tokenId"></param>
		public FieldValue( string fieldName, string tokenId )
		{
			this.FieldName = fieldName;
			this.LoweredFieldName = fieldName.ToLowerInvariant();
			this.ReversedTokenId = tokenId.Reverse();

			this.CreatedOn = DateTime.Now;
		}

		/// <summary>
		/// Obtém o nome do campo
		/// </summary>
		public string LoweredFieldName
		{ get; protected set; }

		/// <summary>
		/// Obtém o nome do campo original
		/// </summary>
		public string FieldName
		{ get; protected set; }

		/// <summary>
		/// Obtém o ID que identifica a entidade de qual o campo pertence
		/// </summary>
		public string ReversedTokenId
		{ get; protected set; }

		/// <summary>
		/// Obtém ou define o valor da propriedade
		/// </summary>
		public string TextValue
		{ get; set; }

		/// <summary>
		/// Obtém ou define o valor original do campo, salvo como binário
		/// </summary>
		public byte[] BinValue
		{ get; set; }

		/// <summary>
		/// Obtém o valor original do token
		/// </summary>
		/// <returns></returns>
		public string GetTokenId()
		{
			return this.ReversedTokenId.Reverse();
		}

		public DateTime CreatedOn
		{ get; protected set; }

		public DateTime UpdatedOn
		{ get; set; }

		/// <summary>
		/// Obtém somente o nome do campo, sem o namespace
		/// </summary>
		/// <returns></returns>
		public string GetPropertyName()
		{
			DataObjectName name = DataObjectName.Parse( this.FieldName );
			return name.Name;
			//int startAt = this.LoweredFieldName.IndexOf( '[' ) + 1;
			//int endAt = this.LoweredFieldName.Length - 1;
			//return this.LoweredFieldName.Substring( startAt, endAt - startAt );
		}
	}
}
